Skip to content

feat(wfctl): natively sync registry core and readme#834

Merged
intel352 merged 2 commits into
mainfrom
issue-762-core-readme-sync
Jun 2, 2026
Merged

feat(wfctl): natively sync registry core and readme#834
intel352 merged 2 commits into
mainfrom
issue-762-core-readme-sync

Conversation

@intel352
Copy link
Copy Markdown
Contributor

@intel352 intel352 commented Jun 2, 2026

Summary

  • replace the registry-sync core bash fallback with a native Go inspector that reads workflow core plugin declarations and validates/updates registry manifests
  • replace the registry-sync readme bash fallback with native README index rendering from registry manifests and templates
  • update release-gate docs and CLI help now that verify-capabilities/core/readme sync are implemented in wfctl

Addresses part of #762. This intentionally leaves workflow-registry wrapper/script removal and any remaining registry cron migration as follow-up cascade work.

Verification

  • GOWORK=off go test ./cmd/wfctl -run TestPluginRegistrySync -count=1
  • GOWORK=off go test ./cmd/wfctl -count=1
  • GOWORK=off golangci-lint run ./cmd/wfctl --new-from-rev origin/main
  • GOWORK=off go build -o /tmp/wfctl-762-core-readme ./cmd/wfctl
  • /tmp/wfctl-762-core-readme plugin registry-sync readme --check --registry-dir /Users/jon/workspace/workflow-registry
  • /tmp/wfctl-762-core-readme plugin registry-sync core --workflow-repo /Users/jon/workspace/workflow/.worktrees/issue-762-core-readme-sync --registry-dir /Users/jon/workspace/workflow-registry
  • git diff --check

Copilot AI review requested due to automatic review settings June 2, 2026 00:41
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR completes the migration of wfctl plugin registry-sync away from bash fallbacks by implementing native Go logic for syncing workflow core plugin manifests and regenerating the workflow-registry README, and updates docs/help text to reflect the new behavior.

Changes:

  • Implement native core plugin inspection (go run inspector) + manifest drift detection/fixing for registry-sync core.
  • Implement native README index rendering from registry manifests/templates for registry-sync readme.
  • Update release-gate docs and CLI help to match the now-native implementation (including --verify-capabilities no longer marked unimplemented).

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
docs/PLUGIN_RELEASE_GATES.md Updates registry-sync documentation to reflect native wfctl ownership of core/readme sync behavior.
cmd/wfctl/plugin_registry_sync.go Updates --verify-capabilities help text (no longer “not yet implemented”).
cmd/wfctl/plugin_registry_sync_test.go Adds tests covering native README drift detection and core manifest drift detection/fix behavior.
cmd/wfctl/plugin_registry_sync_readme.go Replaces bash fallback with native README rendering from manifests/templates.
cmd/wfctl/plugin_registry_sync_core.go Replaces bash fallback with native core plugin inspection + registry manifest syncing.

Comment thread cmd/wfctl/plugin_registry_sync_readme.go
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 2, 2026

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:306: parsing iteration count: invalid syntax
baseline-bench.txt:335062: parsing iteration count: invalid syntax
baseline-bench.txt:657470: parsing iteration count: invalid syntax
baseline-bench.txt:986043: parsing iteration count: invalid syntax
baseline-bench.txt:1280089: parsing iteration count: invalid syntax
baseline-bench.txt:1563050: parsing iteration count: invalid syntax
benchmark-results.txt:306: parsing iteration count: invalid syntax
benchmark-results.txt:325042: parsing iteration count: invalid syntax
benchmark-results.txt:664160: parsing iteration count: invalid syntax
benchmark-results.txt:1015062: parsing iteration count: invalid syntax
benchmark-results.txt:1336768: parsing iteration count: invalid syntax
benchmark-results.txt:1655708: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/GoCodeAlone/workflow/dynamic
cpu: AMD EPYC 7763 64-Core Processor                
                            │ benchmark-results.txt │
                            │        sec/op         │
InterpreterCreation-4                  9.875m ± 66%
ComponentLoad-4                        3.539m ±  2%
ComponentExecute-4                     1.929µ ±  1%
PoolContention/workers-1-4             1.075µ ±  1%
PoolContention/workers-2-4             1.069µ ±  1%
PoolContention/workers-4-4             1.074µ ±  1%
PoolContention/workers-8-4             1.081µ ±  3%
PoolContention/workers-16-4            1.099µ ±  4%
ComponentLifecycle-4                   3.623m ±  1%
SourceValidation-4                     2.357µ ±  1%
RegistryConcurrent-4                   840.4n ±  3%
LoaderLoadFromString-4                 3.622m ±  0%
geomean                                19.24µ

                            │ benchmark-results.txt │
                            │         B/op          │
InterpreterCreation-4                  2.027Mi ± 0%
ComponentLoad-4                        2.180Mi ± 0%
ComponentExecute-4                     1.203Ki ± 0%
PoolContention/workers-1-4             1.203Ki ± 0%
PoolContention/workers-2-4             1.203Ki ± 0%
PoolContention/workers-4-4             1.203Ki ± 0%
PoolContention/workers-8-4             1.203Ki ± 0%
PoolContention/workers-16-4            1.203Ki ± 0%
ComponentLifecycle-4                   2.183Mi ± 0%
SourceValidation-4                     1.984Ki ± 0%
RegistryConcurrent-4                   1.133Ki ± 0%
LoaderLoadFromString-4                 2.182Mi ± 0%
geomean                                15.25Ki

                            │ benchmark-results.txt │
                            │       allocs/op       │
InterpreterCreation-4                   15.68k ± 0%
ComponentLoad-4                         18.02k ± 0%
ComponentExecute-4                       25.00 ± 0%
PoolContention/workers-1-4               25.00 ± 0%
PoolContention/workers-2-4               25.00 ± 0%
PoolContention/workers-4-4               25.00 ± 0%
PoolContention/workers-8-4               25.00 ± 0%
PoolContention/workers-16-4              25.00 ± 0%
ComponentLifecycle-4                    18.07k ± 0%
SourceValidation-4                       32.00 ± 0%
RegistryConcurrent-4                     2.000 ± 0%
LoaderLoadFromString-4                  18.06k ± 0%
geomean                                  183.3

cpu: AMD EPYC 9V74 80-Core Processor                
                            │ baseline-bench.txt │
                            │       sec/op       │
InterpreterCreation-4               9.576m ± 68%
ComponentLoad-4                     3.466m ± 10%
ComponentExecute-4                  1.818µ ±  1%
PoolContention/workers-1-4          1.015µ ±  2%
PoolContention/workers-2-4          1.012µ ±  2%
PoolContention/workers-4-4          1.009µ ±  0%
PoolContention/workers-8-4          1.019µ ±  2%
PoolContention/workers-16-4         1.033µ ±  3%
ComponentLifecycle-4                3.528m ±  0%
SourceValidation-4                  2.154µ ±  1%
RegistryConcurrent-4                814.5n ±  4%
LoaderLoadFromString-4              3.577m ±  2%
geomean                             18.35µ

                            │ baseline-bench.txt │
                            │        B/op        │
InterpreterCreation-4               2.027Mi ± 0%
ComponentLoad-4                     2.180Mi ± 0%
ComponentExecute-4                  1.203Ki ± 0%
PoolContention/workers-1-4          1.203Ki ± 0%
PoolContention/workers-2-4          1.203Ki ± 0%
PoolContention/workers-4-4          1.203Ki ± 0%
PoolContention/workers-8-4          1.203Ki ± 0%
PoolContention/workers-16-4         1.203Ki ± 0%
ComponentLifecycle-4                2.183Mi ± 0%
SourceValidation-4                  1.984Ki ± 0%
RegistryConcurrent-4                1.133Ki ± 0%
LoaderLoadFromString-4              2.182Mi ± 0%
geomean                             15.25Ki

                            │ baseline-bench.txt │
                            │     allocs/op      │
InterpreterCreation-4                15.68k ± 0%
ComponentLoad-4                      18.02k ± 0%
ComponentExecute-4                    25.00 ± 0%
PoolContention/workers-1-4            25.00 ± 0%
PoolContention/workers-2-4            25.00 ± 0%
PoolContention/workers-4-4            25.00 ± 0%
PoolContention/workers-8-4            25.00 ± 0%
PoolContention/workers-16-4           25.00 ± 0%
ComponentLifecycle-4                 18.07k ± 0%
SourceValidation-4                    32.00 ± 0%
RegistryConcurrent-4                  2.000 ± 0%
LoaderLoadFromString-4               18.06k ± 0%
geomean                               183.3

pkg: github.com/GoCodeAlone/workflow/middleware
cpu: AMD EPYC 7763 64-Core Processor                
                                  │ benchmark-results.txt │
                                  │        sec/op         │
CircuitBreakerDetection-4                     286.1n ± 2%
CircuitBreakerExecution_Success-4             21.54n ± 0%
CircuitBreakerExecution_Failure-4             66.49n ± 0%
geomean                                       74.27n

                                  │ benchmark-results.txt │
                                  │         B/op          │
CircuitBreakerDetection-4                    144.0 ± 0%
CircuitBreakerExecution_Success-4            0.000 ± 0%
CircuitBreakerExecution_Failure-4            0.000 ± 0%
geomean                                                 ¹
¹ summaries must be >0 to compute geomean

                                  │ benchmark-results.txt │
                                  │       allocs/op       │
CircuitBreakerDetection-4                    1.000 ± 0%
CircuitBreakerExecution_Success-4            0.000 ± 0%
CircuitBreakerExecution_Failure-4            0.000 ± 0%
geomean                                                 ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                  │ baseline-bench.txt │
                                  │       sec/op       │
CircuitBreakerDetection-4                  297.4n ± 5%
CircuitBreakerExecution_Success-4          22.68n ± 1%
CircuitBreakerExecution_Failure-4          70.94n ± 0%
geomean                                    78.21n

                                  │ baseline-bench.txt │
                                  │        B/op        │
CircuitBreakerDetection-4                 144.0 ± 0%
CircuitBreakerExecution_Success-4         0.000 ± 0%
CircuitBreakerExecution_Failure-4         0.000 ± 0%
geomean                                              ¹
¹ summaries must be >0 to compute geomean

                                  │ baseline-bench.txt │
                                  │     allocs/op      │
CircuitBreakerDetection-4                 1.000 ± 0%
CircuitBreakerExecution_Success-4         0.000 ± 0%
CircuitBreakerExecution_Failure-4         0.000 ± 0%
geomean                                              ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/module
cpu: AMD EPYC 7763 64-Core Processor                
                                 │ benchmark-results.txt │
                                 │        sec/op         │
IaCStateBackend_InProcess-4                 347.5n ± 15%
IaCStateBackend_GRPC-4                      9.417m ±  3%
JQTransform_Simple-4                        689.0n ± 32%
JQTransform_ObjectConstruction-4            1.469µ ±  1%
JQTransform_ArraySelect-4                   3.276µ ±  0%
JQTransform_Complex-4                       38.24µ ±  1%
JQTransform_Throughput-4                    1.769µ ±  1%
SSEPublishDelivery-4                        64.70n ±  0%
geomean                                     3.842µ

                                 │ benchmark-results.txt │
                                 │         B/op          │
IaCStateBackend_InProcess-4                 416.0 ± 0%
IaCStateBackend_GRPC-4                    5.770Mi ± 9%
JQTransform_Simple-4                      1.273Ki ± 0%
JQTransform_ObjectConstruction-4          1.773Ki ± 0%
JQTransform_ArraySelect-4                 2.625Ki ± 0%
JQTransform_Complex-4                     16.31Ki ± 0%
JQTransform_Throughput-4                  1.984Ki ± 0%
SSEPublishDelivery-4                        0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

                                 │ benchmark-results.txt │
                                 │       allocs/op       │
IaCStateBackend_InProcess-4                 2.000 ± 0%
IaCStateBackend_GRPC-4                     6.832k ± 0%
JQTransform_Simple-4                        10.00 ± 0%
JQTransform_ObjectConstruction-4            15.00 ± 0%
JQTransform_ArraySelect-4                   30.00 ± 0%
JQTransform_Complex-4                       328.0 ± 0%
JQTransform_Throughput-4                    17.00 ± 0%
SSEPublishDelivery-4                        0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                 │ baseline-bench.txt │
                                 │       sec/op       │
IaCStateBackend_InProcess-4              289.2n ± 28%
IaCStateBackend_GRPC-4                   10.07m ± 20%
JQTransform_Simple-4                     652.9n ± 30%
JQTransform_ObjectConstruction-4         1.402µ ±  0%
JQTransform_ArraySelect-4                3.368µ ±  0%
JQTransform_Complex-4                    41.56µ ±  0%
JQTransform_Throughput-4                 1.714µ ±  2%
SSEPublishDelivery-4                     63.37n ±  0%
geomean                                  3.767µ

                                 │ baseline-bench.txt │
                                 │        B/op        │
IaCStateBackend_InProcess-4              416.0 ± 0%
IaCStateBackend_GRPC-4                 5.753Mi ± 6%
JQTransform_Simple-4                   1.273Ki ± 0%
JQTransform_ObjectConstruction-4       1.773Ki ± 0%
JQTransform_ArraySelect-4              2.625Ki ± 0%
JQTransform_Complex-4                  16.31Ki ± 0%
JQTransform_Throughput-4               1.984Ki ± 0%
SSEPublishDelivery-4                     0.000 ± 0%
geomean                                             ¹
¹ summaries must be >0 to compute geomean

                                 │ baseline-bench.txt │
                                 │     allocs/op      │
IaCStateBackend_InProcess-4              2.000 ± 0%
IaCStateBackend_GRPC-4                  6.851k ± 0%
JQTransform_Simple-4                     10.00 ± 0%
JQTransform_ObjectConstruction-4         15.00 ± 0%
JQTransform_ArraySelect-4                30.00 ± 0%
JQTransform_Complex-4                    328.0 ± 0%
JQTransform_Throughput-4                 17.00 ± 0%
SSEPublishDelivery-4                     0.000 ± 0%
geomean                                             ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/schema
cpu: AMD EPYC 7763 64-Core Processor                
                                    │ benchmark-results.txt │
                                    │        sec/op         │
SchemaValidation_Simple-4                       1.125µ ± 3%
SchemaValidation_AllFields-4                    1.671µ ± 2%
SchemaValidation_FormatValidation-4             1.602µ ± 1%
SchemaValidation_ManySchemas-4                  1.831µ ± 4%
geomean                                         1.532µ

                                    │ benchmark-results.txt │
                                    │         B/op          │
SchemaValidation_Simple-4                      0.000 ± 0%
SchemaValidation_AllFields-4                   0.000 ± 0%
SchemaValidation_FormatValidation-4            0.000 ± 0%
SchemaValidation_ManySchemas-4                 0.000 ± 0%
geomean                                                   ¹
¹ summaries must be >0 to compute geomean

                                    │ benchmark-results.txt │
                                    │       allocs/op       │
SchemaValidation_Simple-4                      0.000 ± 0%
SchemaValidation_AllFields-4                   0.000 ± 0%
SchemaValidation_FormatValidation-4            0.000 ± 0%
SchemaValidation_ManySchemas-4                 0.000 ± 0%
geomean                                                   ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                    │ baseline-bench.txt │
                                    │       sec/op       │
SchemaValidation_Simple-4                   1.089µ ± 17%
SchemaValidation_AllFields-4                1.624µ ±  1%
SchemaValidation_FormatValidation-4         1.569µ ±  2%
SchemaValidation_ManySchemas-4              1.601µ ±  4%
geomean                                     1.452µ

                                    │ baseline-bench.txt │
                                    │        B/op        │
SchemaValidation_Simple-4                   0.000 ± 0%
SchemaValidation_AllFields-4                0.000 ± 0%
SchemaValidation_FormatValidation-4         0.000 ± 0%
SchemaValidation_ManySchemas-4              0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

                                    │ baseline-bench.txt │
                                    │     allocs/op      │
SchemaValidation_Simple-4                   0.000 ± 0%
SchemaValidation_AllFields-4                0.000 ± 0%
SchemaValidation_FormatValidation-4         0.000 ± 0%
SchemaValidation_ManySchemas-4              0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/store
cpu: AMD EPYC 7763 64-Core Processor                
                                   │ benchmark-results.txt │
                                   │        sec/op         │
EventStoreAppend_InMemory-4                   1.323µ ± 14%
EventStoreAppend_SQLite-4                     1.362m ±  5%
GetTimeline_InMemory/events-10-4              14.93µ ±  1%
GetTimeline_InMemory/events-50-4              82.00µ ±  2%
GetTimeline_InMemory/events-100-4             164.3µ ± 23%
GetTimeline_InMemory/events-500-4             656.2µ ±  2%
GetTimeline_InMemory/events-1000-4            1.356m ±  2%
GetTimeline_SQLite/events-10-4                107.8µ ±  6%
GetTimeline_SQLite/events-50-4                252.7µ ±  0%
GetTimeline_SQLite/events-100-4               428.5µ ±  1%
GetTimeline_SQLite/events-500-4               1.838m ±  2%
GetTimeline_SQLite/events-1000-4              3.563m ±  0%
geomean                                       232.2µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                     807.0 ± 6%
EventStoreAppend_SQLite-4                     1.985Ki ± 1%
GetTimeline_InMemory/events-10-4              7.953Ki ± 0%
GetTimeline_InMemory/events-50-4              46.62Ki ± 0%
GetTimeline_InMemory/events-100-4             94.48Ki ± 0%
GetTimeline_InMemory/events-500-4             472.8Ki ± 0%
GetTimeline_InMemory/events-1000-4            944.3Ki ± 0%
GetTimeline_SQLite/events-10-4                16.74Ki ± 0%
GetTimeline_SQLite/events-50-4                87.14Ki ± 0%
GetTimeline_SQLite/events-100-4               175.4Ki ± 0%
GetTimeline_SQLite/events-500-4               846.1Ki ± 0%
GetTimeline_SQLite/events-1000-4              1.639Mi ± 0%
geomean                                       67.47Ki

                                   │ benchmark-results.txt │
                                   │       allocs/op       │
EventStoreAppend_InMemory-4                     7.000 ± 0%
EventStoreAppend_SQLite-4                       53.00 ± 0%
GetTimeline_InMemory/events-10-4                125.0 ± 0%
GetTimeline_InMemory/events-50-4                653.0 ± 0%
GetTimeline_InMemory/events-100-4              1.306k ± 0%
GetTimeline_InMemory/events-500-4              6.514k ± 0%
GetTimeline_InMemory/events-1000-4             13.02k ± 0%
GetTimeline_SQLite/events-10-4                  382.0 ± 0%
GetTimeline_SQLite/events-50-4                 1.852k ± 0%
GetTimeline_SQLite/events-100-4                3.681k ± 0%
GetTimeline_SQLite/events-500-4                18.54k ± 0%
GetTimeline_SQLite/events-1000-4               37.29k ± 0%
geomean                                        1.162k

cpu: AMD EPYC 9V74 80-Core Processor                
                                   │ baseline-bench.txt │
                                   │       sec/op       │
EventStoreAppend_InMemory-4                1.027µ ± 12%
EventStoreAppend_SQLite-4                  1.032m ±  9%
GetTimeline_InMemory/events-10-4           13.17µ ±  4%
GetTimeline_InMemory/events-50-4           71.56µ ± 23%
GetTimeline_InMemory/events-100-4          111.0µ ±  3%
GetTimeline_InMemory/events-500-4          565.1µ ±  0%
GetTimeline_InMemory/events-1000-4         1.144m ±  1%
GetTimeline_SQLite/events-10-4             85.47µ ±  1%
GetTimeline_SQLite/events-50-4             221.5µ ±  1%
GetTimeline_SQLite/events-100-4            385.7µ ±  0%
GetTimeline_SQLite/events-500-4            1.678m ±  1%
GetTimeline_SQLite/events-1000-4           3.264m ±  1%
geomean                                    194.1µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                  795.5 ± 7%
EventStoreAppend_SQLite-4                  1.984Ki ± 2%
GetTimeline_InMemory/events-10-4           7.953Ki ± 0%
GetTimeline_InMemory/events-50-4           46.62Ki ± 0%
GetTimeline_InMemory/events-100-4          94.48Ki ± 0%
GetTimeline_InMemory/events-500-4          472.8Ki ± 0%
GetTimeline_InMemory/events-1000-4         944.3Ki ± 0%
GetTimeline_SQLite/events-10-4             16.74Ki ± 0%
GetTimeline_SQLite/events-50-4             87.14Ki ± 0%
GetTimeline_SQLite/events-100-4            175.4Ki ± 0%
GetTimeline_SQLite/events-500-4            846.1Ki ± 0%
GetTimeline_SQLite/events-1000-4           1.639Mi ± 0%
geomean                                    67.38Ki

                                   │ baseline-bench.txt │
                                   │     allocs/op      │
EventStoreAppend_InMemory-4                  7.000 ± 0%
EventStoreAppend_SQLite-4                    53.00 ± 0%
GetTimeline_InMemory/events-10-4             125.0 ± 0%
GetTimeline_InMemory/events-50-4             653.0 ± 0%
GetTimeline_InMemory/events-100-4           1.306k ± 0%
GetTimeline_InMemory/events-500-4           6.514k ± 0%
GetTimeline_InMemory/events-1000-4          13.02k ± 0%
GetTimeline_SQLite/events-10-4               382.0 ± 0%
GetTimeline_SQLite/events-50-4              1.852k ± 0%
GetTimeline_SQLite/events-100-4             3.681k ± 0%
GetTimeline_SQLite/events-500-4             18.54k ± 0%
GetTimeline_SQLite/events-1000-4            37.29k ± 0%
geomean                                     1.162k

Benchmarks run with go test -bench=. -benchmem -count=6.
Regressions ≥ 20% are flagged. Results compared via benchstat.

@codecov
Copy link
Copy Markdown

codecov Bot commented Jun 2, 2026

Codecov Report

❌ Patch coverage is 67.16867% with 109 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
cmd/wfctl/plugin_registry_sync_core.go 60.86% 59 Missing and 13 partials ⚠️
cmd/wfctl/plugin_registry_sync_readme.go 74.82% 23 Missing and 14 partials ⚠️

📢 Thoughts on this report? Let us know!

@intel352 intel352 merged commit 67ba6b3 into main Jun 2, 2026
22 checks passed
@intel352 intel352 deleted the issue-762-core-readme-sync branch June 2, 2026 00:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants